perm filename REFORM.SAI[4,KMC]1 blob
sn#177272 filedate 1975-09-17 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00005 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 INDEX makes an index from STAMPS
C00004 00003 α MAKE_LABELS makes labels from STAMPS.IND
C00006 00004 α BUBBLE arranges an ATLAS by longitude or latitude
C00010 00005 α This selects the requested routine
C00011 ENDMK
C⊗;
COMMENT INDEX makes an index from STAMPS;
BEGIN
REQUIRE "IODEFS.SAI[SEC,RCP]" SOURCE_FILE;
PROC INDEX;
BEGIN
STRING ARRAY LOC[0:5];
STRING LINE;
SETBREAK(2, TAB, NULL, "XNR");
SETBREAK(3, "←→", NULL, "INS");
SETBREAK(4, "@", NULL, "INS");
FILIN("STAMPS[SEC,RCP]", INCH1);
FILOUT("STAMPS.IND[SEC,RCP]", OUCH1);
EAT_DIR(LINE, INCH1);
WHILE (LINE ← IN_LINE) DO
BEGIN
STRING TABS, REST, LEAD, REALLY;
INTEGER BRK2;
TABS ← SCAN(LINE, 2, BRK);
LOC[LN(TABS)] ← LINE;
LINE ← LINE ∂ "→ ";
REST ← NULL;
FOR I ← LN(TABS)-1 STEP -1 UNTIL 1 DO
REST ← REST ∂ " ⊂ " ∂ LOC[I];
BRK ← "←";
WHILE BRK = "←" DO
BEGIN
OUT_LINE(LINE[1 TO ∞-3] & REST);
LEAD ← SCAN(LINE, 3, BRK);
LINE ← LINE[2 TO ∞] & LEAD & "→ ";
REALLY ← SCAN(LEAD, 4, BRK2);
IF BRK2 = "@" THEN OUT_LINE(LEAD[2 TO ∞] & "@" ∂ REALLY);
END;
END;
RELEASE(INCH1);
RELEASE(OUCH1);
END;
α MAKE_LABELS makes labels from STAMPS.IND;
PROC MAKE_LABELS;
BEGIN
STRING LINE;
SETBREAK(2, "⊂", NULL, "INS");
SETBREAK(3, "←→@⊂#", NULL, "INS");
FILIN("STAMPS.IND[SEC,RCP]", INCH1);
FILOUT("STAMPS.LAB[SEC,RCP]", OUCH1);
EAT_DIR(LINE, INCH1);
WHILE (LINE ← IN_LINE) DO
BEGIN
STRING LEAD, REALLY;
REALLY ← LEAD ← SCAN(LINE, 2, BRK);
REALLY ← SCAN(REALLY, 3, BRK);
IF BRK ≠ "#" THEN
BEGIN
BLANKS ← NULL;
DO BEGIN
OUT_LINE(BLANKS & LEAD);
LEAD ← SCAN(LINE, 2, BRK);
BLANKS ← BLANKS & " ";
END
UNTIL ¬LEAD;
OUT_LINE(NULL);
END;
END;
RELEASE(INCH1);
RELEASE(OUCH1);
END;
α BUBBLE arranges an ATLAS by longitude or latitude;
PROC BUBBLE;
BEGIN
SAFE STRING ARRAY WORDS [1:300];
SAFE INTEGER ARRAY LATS [1:300, 0:1];
INTEGER SIZE, USE_LAT, MAX_SIZE;
INTEGER MIN_LONG, MAX_LONG, MIN_LAT, MAX_LAT;
BOOLEAN CLOSE_UP;
STRING NEXT;
MAX_SIZE ← 300;
BREAK_TAB;
BREAK_EXT;
FILIN((FILE ← GET_A_STRING("Sort which ATLAS")), INCH1);
IF (NEXT ← GET_A_STRING("What region do you want [<CR> for all]")) THEN
BEGIN
STRING TEMP;
CLOSE_UP ← TRUE;
TEMP ← GET_A_STRING("West-most longitude");
MIN_LONG ← SCAN_LONG(TEMP);
TEMP ← GET_A_STRING("East-most longitude");
MAX_LONG ← SCAN_LONG(TEMP);
TEMP ← GET_A_STRING("North-most latitude");
MIN_LAT ← -SCAN_LAT(TEMP);
TEMP ← GET_A_STRING("South-most latitude");
MAX_LAT ← -SCAN_LAT(TEMP);
FILE ← NEXT;
END
ELSE CLOSE_UP ← FALSE;
USE_LAT ← (IF GET_A_STRING("Sort by Longitude [Y,N]") = "Y" THEN 0 ELSE 1);
SIZE ← 0;
EOF ← FALSE;
WHILE ¬EOF AND (SIZE < MAX_SIZE) DO
BEGIN
INTEGER J;
SAFE INTEGER ARRAY LAT[0:1];
STRING CITY, TEMP;
IF ¬(NEXT ← IN_LINE) THEN CONTINUE;
CITY ← NEXT;
TEMP ← SCAN(NEXT, 3, BRK);
LAT[0] ← SCAN_LONG(NEXT);
LAT[1] ← -SCAN_LAT(NEXT);
IF CLOSE_UP AND (LAT[0] < MIN_LONG OR LAT[0] > MAX_LONG OR
LAT[1] < MIN_LAT OR LAT[1] > MAX_LAT) THEN CONTINUE;
SIZE ← SIZE + 1;
J ← SIZE;
WHILE ((J ← J-1) ≥ 1) AND LAT[USE_LAT] < LATS[J, USE_LAT] DO
BEGIN
WORDS[J+1] ← WORDS[J];
FOR I ← 0 TIL 1 DO LATS[J+1, I] ← LATS[J, I];
END;
WORDS[J+1] ← CITY;
FOR I ← 0 TIL 1 DO LATS[J+1, I] ← LAT[I];
END;
IF ¬EOF THEN OUTSTR("Only first" ∂ CVS(MAX_SIZE) ∂ "entries sorted." ↓)
ELSE OUTSTR("There were" ∂ CVS(SIZE) ∂ "cities." ↓);
RELEASE(INCH1);
FILOUT(SCAN(FILE, 7, BRK) & (IF USE_LAT THEN ".LAT" ELSE ".LON"), OUCH1);
FOR I ← 1 TIL SIZE DO OUT_LINE(WORDS[I]);
RELEASE(OUCH1);
END;
α This selects the requested routine;
WHILE TRUE DO
BEGIN
STRING JOB;
BREAK_LINE;
JOB ← GET_A_STRING("Index, Labels, Sort atlas, eXit");
IF JOB = "I" THEN INDEX
ELSE IF JOB = "L" THEN MAKE_LABELS
ELSE IF JOB = "S" THEN BUBBLE
ELSE IF JOB = "X" THEN DONE
ELSE OUTSTR("You blew it" ↓);
END;
END